/*
  2010-12-01 : message key 原本用 String 的方式，改為 enum。
*/
package idv.jieh.web;

import idv.jieh.commons.comm.BasicClass;
import idv.jieh.commons.util.*;
import org.apache.struts.action.*;

public class StrutsUtility extends BasicClass {

  protected PhoneNumberRepair pnr = new PhoneNumberRepair();

  public static enum MSG_KEY{
    ERRORS("errors"),
    ERROR_KEYIN_EMPTY("errors.keyin.empty"),
    ERROR_KEYIN_NOT_EQUALS("errors.keyin.not_equals"),
    ERROR_KEYIN_INCORRECT_FORMAT("errors.keyin.IncorrectFormat"),
    ERROR_KEYIN_NOT_DIGIT("errors.keyin.not_digit"),
    ERROR_KEYIN_NOT_LETTER_OR_DIGIT("errors.keyin.not_letter_or_digit"),
    ERROR_KEYIN_EMAIL("errors.keyin.email"),
    ERROR_KEYIN_MAXLENGTH("errors.keyin.maxlength"), //add by jieh 2011-11-03
    ERROR_KEYIN_MINLENGTH("errors.keyin.minlength"), //add by jieh 2011-11-03
    ERROR_KEYIN_OVER_RANGE("errors.keyin.over_range"), //add by jieh 2011-11-03
    ERROR_KEYIN_OVER_RANGE_BOTH("errors.keyin.over_range_both"), //add by jieh 2011-11-03

    ;

    private String key = null;
    private MSG_KEY(String key){
      this.key = key;
    }

    public String key(){ return key; }
  }

  //******** 基本的訊息加入方法 start ********//

  // 加入錯誤訊息(有前置文字，message key：enum 版)。
  protected void addMessage(ActionMessages messages, MSG_KEY msgkey, String... values) {
    addMessage(messages, msgkey.key(), values);
  }

  // 加入錯誤訊息(不需要自訂前置文字，message key：String 版)。
  protected void addMessage(ActionMessages messages, String errid) {
    addMessage(messages, errid, "");
  }

  // 加入錯誤訊息(有前置文字，message key：String 版)。
  protected void addMessage(ActionMessages messages, String errid, String... values) {
    messages.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage(errid, values));
//    messages.add(ActionErrors.GLOBAL_MESSAGE,
//      DataAnalysis.trimNull(preposition).length() == 0 ? new ActionMessage(errid) :
//      new ActionMessage(errid, preposition));
  }

  /******** 基本的訊息加入方法 end ********/

//  public String repairCellNumber(
//    ActionMessages messages,
//    String phone,
//    String preposition)
//  {
//    return this.repairCellNumber(messages, phone, MSG_KEY.ERROR_KEYIN_INCORRECT_FORMAT.ERROR_KEYIN_INCORRECT_FORMAT.key(), preposition);
//  }
//
//  /**
//   *
//   * @param messages ActionMessages
//   * @param maybeDate String 受檢查的電話號碼。
//   * @param preposition String
//   * @return String
//   */
//  public String repairPhoneNumber(
//    ActionMessages messages,
//    String phone,
//    String preposition)
//  {
//    return this.repairPhoneNumber(messages, phone, MSG_KEY.ERROR_KEYIN_INCORRECT_FORMAT.ERROR_KEYIN_INCORRECT_FORMAT.key(), preposition);
//  }

  /**
   * 檢查傳入值是否為整數。<p>
   * 如果不是整數則引用 message key : ERROR_KEYIN_NOT_DIGIT。
   * @param messages ActionMessages Object。
   * @param value String 需要檢核的資料。
   * @param preposition 錯誤訊息的前置文字。
   * @return boolean true 正確，傳入值為數字；false 錯誤，傳入值非數字！
   */
  public boolean checkDigit(ActionMessages messages, String value, String preposition) {
    if (!DataAnalysis.isDigit(value)) {
      addMessage(messages, MSG_KEY.ERROR_KEYIN_NOT_DIGIT, preposition);
      return false;
    }
    return true;
  }

  /**
   * 判斷字串是否不含特殊字元，而且不含中文字。<p>
   * @param messages ActionMessages Object。
   * @param value String 需要檢核的資料。
   * @param preposition 錯誤訊息的前置文字。
   * @return boolean true 正確，傳入值為字母或數字；false 錯誤，傳入值非字母或數字！
   */
//  public boolean checkOnlyLetterOrDigit(ActionMessages messages, String value, String preposition) {
//    if (!DataAnalysis.isLetterOrDigit(value)) {
//      addMessage(messages, MSG_KEY.ERROR_KEYIN_NOT_LETTER_OR_DIGIT, preposition);
//      return false;
//    }
//    return true;
//  }

  /**
   * 檢查使用者是否登入成功。<p>
   *
   * @param messages ActionMessages
   * @param db_password String
   * @param password String
   * @return boolean true 通過密碼檢核；false 密碼檢核失敗！
   */
  public boolean checkPassword(
    ActionMessages messages,
    String db_password,
    String password)
  {
    if (!password.equals(CodeParser.decode(db_password))) {
//    if (!db_password.equals(CodeParser.decode(password))) {
      addMessage(messages, "errors.login.password_fail");
      return false;
    }
    return true;
  }

  /**
   * 檢查至少輸入一項。<p>
   * @param messages ActionMessages
   * @param preposition String
   * @param value String[]
   * @return boolean
   */
  public boolean checkOverOne(ActionMessages messages, String preposition, String[] value){
    if(value == null || DataAnalysis.countNotEmpty(value) == 0){
      addMessage(messages, MSG_KEY.ERROR_KEYIN_EMPTY.key(), preposition);
      return false;
    }
    return true;
  }


  /**
   * 檢查必要輸入欄位。<p>
   * 如果其中一項沒有資料則判定為錯誤，並回傳 false，如果全部資料均有值則回傳 true。
   * @param messages ActionMessages
   * @param preposition String
   * @param value String[]
   * @return boolean
   */
  public boolean checkEmpty(ActionMessages messages, String preposition, String... value){
    if (DataAnalysis.isEmpty(value)) {
      addMessage(messages, MSG_KEY.ERROR_KEYIN_EMPTY.key(), preposition);
      return false;
    }
    return true;
  }

  /******** database modify messages start ********/

  public static enum SQL_ACTION {QUERY, DELETE, UPDATE, INSERT}

  /**
   * 針對資料庫的異動處理給予訊息。<p>
   * 這個方法可以用的的範圍有查詢(QUERY)、刪除(DELETE)、修改(UPDATE)、新增(INSERT)。<br>
   *
   * 查詢：輸入的 result 如果是 true 則會產生【查無資料】等訊息。也就是說可以直接放入
   * isEmpty() 等方法的呼叫結果。successfulmsg 不參考。<br>
   *
   * 刪除：如果輸入的 result 是 true 則表示刪除失敗；如果 false 而 succsessfulmsg true
   * 則產生刪除成功的訊息。<br>
   *
   * 修改：如果輸入的 result 是 true 則表示修改失敗；如果 false 而 succsessfulmsg true
   * 則產生修改成功的訊息。<br>
   *
   * 新增：如果輸入的 result 是 true 則表示新增失敗；如果 false 而 succsessfulmsg true
   * 則產生新增成功的訊息。<br>
   *
   * @param messages ActionMessages Object。
   * @param action int 資料庫異動的動作。
   * @param result boolean 傳入異動結果，影響的狀況會因 action 所傳入的參數而不同。
   * @param successfulmsg boolean 設定在資料庫異動成功的話是否顯示成功訊息，true：顯示
   * ；false：不顯示。
   */
  public void checkSQLAction(
    ActionMessages messages,
    SQL_ACTION action,
    boolean result,
    boolean successfulmsg) {
    switch (action) {
      case QUERY:
        if (result)
          addMessage(messages, "errors.query.Empty");
        break;
      default:
        // 資料庫異動失敗
        if (result) {
          addMessage(messages, "errors.database.Fail");
        // 刪除成功，再判斷是否要產生成功訊息
        }else if (successfulmsg) {
          switch (action) {
            case DELETE:
              addMessage(messages, "messages.delete.Successful");
              break;
            case UPDATE:
            case INSERT:
              addMessage(messages, "messages.update.Successful");
              break;
          }
        }
    }
  }

  /******** database modify messages end ********/

}
